package urjc.as.emergencies.resources.ambulance;

import org.restlet.Context;
import org.restlet.data.Form;
import org.restlet.data.MediaType;
import org.restlet.data.Request;
import org.restlet.data.Response;
import org.restlet.data.Status;
import org.restlet.resource.Representation;
import org.restlet.resource.Resource;
import org.restlet.resource.ResourceException;
import org.restlet.resource.StringRepresentation;
import org.restlet.resource.Variant;

import urjc.as.emergencies.client.CommToolkit;
import urjc.as.emergencies.data.Ambulance;
import urjc.as.emergencies.data.BaseEntity;
import urjc.as.emergencies.data.AmbulanceList;
import urjc.as.emergencies.data.Storage;

public class AmbulancesResource extends Resource {
	
	public AmbulancesResource(Context context, Request request, Response response){
		super(context, request, response);
		getVariants().add(new Variant(MediaType.TEXT_XML));
	}
	
	@Override
	public boolean allowGet() {
		return true;
	}

	@Override
	public boolean allowPost() {
		return true;
	}
	
	@Override
	public boolean allowDelete() {
		return false;
	}

	@Override
	public boolean allowPut() {
		return true;
	}
		

	/**
	 * Método GET que devuelve la representacion de la lista de ambulancias.
	 * Ademas la peticiones parametrizada para devolver solo las ambulancias libres.
	 */
	@Override
	public Representation represent(Variant variant) throws ResourceException {	
		
		Representation rep = null;
		Storage storage = Storage.getInstance();
		BaseEntity resource = storage.getEntity(getRequest().getResourceRef().getBaseRef().toString());
				
		Form form = (Form) getRequest().getResourceRef().getQueryAsForm();
		String estado = (String)form.getValues("estado");
		if(estado != null && estado.compareTo("libre")==0){
			//Devolver representacion de ambulancias libres
			AmbulanceList libres = new AmbulanceList();
						
			//Obtener todas las ambulancias
			AmbulanceList ambulancias = (AmbulanceList) resource;
			for (String s : ambulancias.getListaAmbulancias()){
				//Hacer un get por cada una de las ambulancias para ver si esta libre
				Ambulance a = (Ambulance) CommToolkit.getRepresentation(s);
				
				if(a.getStatus()==Ambulance.LIBRE){
					libres.getListaAmbulancias().add(a.getUri());
				}
			}
			
			//Devuelve la representacion de la lista de libres
			String libresRep = libres.serializar();
			return new StringRepresentation(libresRep, MediaType.TEXT_XML);
		}else{		
	
			if (resource != null) {
				// Obtiene la representación XML de la entidad
				String stringRep = resource.serializar();
	
				// Genera una representación adecuada a la variante
				// seleccionada.
				if (variant.getMediaType().equals(MediaType.TEXT_XML)) {
					// Envia la representación XML directamente
					rep = new StringRepresentation(stringRep, MediaType.TEXT_XML);
				} else {
					// No es una de las representaciones que puedo ofrecer,
					// debió
					// existir un error en la negociación de contenido.
					throw new ResourceException(
							Status.CLIENT_ERROR_UNSUPPORTED_MEDIA_TYPE);
				}
			} else {
				// El objeto no está en el almacenamiento
				throw new ResourceException(Status.CLIENT_ERROR_NOT_FOUND);
			}
			
			return rep;
		}
	}

	/**
	 * Tratamiento del metodo POST. Crea la representación de una nueva ambulancia.
	 */
	@Override
	public void acceptRepresentation(Representation entity)
			throws ResourceException {
		

		AmbulanceList ambulancias = (AmbulanceList) Storage.getInstance().getEntity(
				getRequest().getResourceRef().getBaseRef().toString());
		
		try {
			if (entity.getMediaType().equals(MediaType.TEXT_XML)) {
				//Crea la nueva ambulancia con la info de la peticion
				Ambulance ambulance = (Ambulance) Ambulance.deserializar(getRequest()
						.getEntity().getText());
				
				int id = ambulancias.generaAmbulanciaID();	
				ambulance.setId(id);
				
				ambulance.setUri(ambulancias.getUri() + "/"
						+ id);
				
				//Añadir a la lista de ambulancias
				ambulancias.anadirAmbulancia(ambulance.getUri());
				
				//Almacenar en storage
				Storage.getInstance().addEntity(ambulance);
				
				// Location header:
				getResponse().setLocationRef(ambulance.getUri());
			} else {
				throw new ResourceException(
						Status.CLIENT_ERROR_UNSUPPORTED_MEDIA_TYPE);
			}

			// Si todo va bien, envía: (201 -- Created)
			getResponse().setStatus(Status.SUCCESS_CREATED);
		} catch (Exception e) {
			// Si saltan excepciones porque el destinatario no existe,
			// entonces:
			throw new ResourceException(Status.CLIENT_ERROR_BAD_REQUEST);
		}		
	}

	@Override
	public void storeRepresentation(Representation entity)
			throws ResourceException {
		
		try {
			if (entity.getMediaType().equals(MediaType.TEXT_XML)) {
				//Obtengo la nueva representacion
				String xmlAmbulancias = getRequest().getEntity().getText();
				AmbulanceList nuevasAmbulancias = (AmbulanceList) AmbulanceList.deserializar(xmlAmbulancias);
						
				// Almaceno
				Storage.getInstance().addEntity(nuevasAmbulancias);
				getResponse().setLocationRef(nuevasAmbulancias.getUri());
			} else {
				throw new ResourceException(
						Status.CLIENT_ERROR_UNSUPPORTED_MEDIA_TYPE);
			}

			// Si todo va bien, envía: (200 -- Created)
			getResponse().setStatus(Status.SUCCESS_OK);
		} catch (Exception e) {
			// Si saltan excepciones porque el destinatario no existe,
			// entonces:
			throw new ResourceException(Status.CLIENT_ERROR_BAD_REQUEST);
		}
		
		
	}
	
	
}
